package ThreadDemo;
//懒汉单例模式，Singleton类加载时不会立即创建实例
//直到第一次使用这个类的时候才加载实例
//懒汉模式比饿汉模式效率更高，因为饿汉模式有很大几率用不到，
// 就节省了创建实例的开销
public class ThreadDemo21 {
    static class Singleton{
        private Singleton(){}
        //人生如戏，全靠演技
        //以下变量加volatile为了保证多个线程之间的内存可见性
        //一个线程创建实例，一个线程读取实例，
        // 当第一个加锁线程创建成功之后，第二个加锁失败的线程在获取到锁的时候之后，判断实例是否为空的时候可能还会是第一次的状态(空)
        private static volatile Singleton instance=null;
        public static Singleton getInstance(){
            //直到调用getInstance()时才创建实例
            if(instance==null){
                //如果不加上面这个判断，
                // 则每次进来之后都会争夺以下的锁，效率不高
                //加上之后如果已经创建了实例，就直接返回实例
                synchronized(Singleton.class) {
                    if(instance==null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}
